--[[
Author: 火红色祥云 809880192@qq.com
Date: 2023-10-29 11:20:27
LastEditors: 火红色祥云 809880192@qq.com
LastEditTime: 2023-10-29 11:20:31
FilePath: /lua-test/Part2/02_datatype.lua
Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--]]

--[[
nil	        这个最简单，只有值nil属于该类，表示一个无效值（在条件表达式中相当于false）。
boolean	    包含两个值：false和true。
number	    表示双精度类型的实浮点数
string	    字符串由一对双引号或单引号来表示
function	由 C 或 Lua 编写的函数
userdata	表示任意存储在变量中的C数据结构
thread	    表示执行的独立线路，用于执行协同程序
table	    Lua 中的表（table）其实是一个"关联数组"（associative arrays），数组的索引可以是数字、字符串或表类型。
            在 Lua 里，table 的创建是通过"构造表达式"来完成，最简单构造表达式是{}，用来创建一个空表。
]]

print(type(nil))
print(type(false))
print(type(3.14))
print(type("hello"))
print(type(type))
--[[
    nil
    boolean
    number
    string
    function
]]

tab1 = {key1 = "value1",key2 = "value2","value3"}
for k, v in pairs(tab1) do
    print(k .. "-" .. v)    --字符串连接使用的是 .. 
end
--[[
    1-value3
    key2-value2
    key1-value1
]]
tab1.key1 = nil --相当于删除作用
for k, v in pairs(tab1) do
    print(k .. "-" .. v)    --字符串连接使用的是 .. 
end
--[[
    1-value3
    key2-value2
]]

print(type(x))
print(type(x)==nil)
print(type(x)=="nil")   --nil 作比较时应该加上双引号"
--[[
    nil
    false
    true
]]

--[[
    boolean 类型只有两个可选值：true（真） 和 false（假），Lua 把 false 和 nil 看作是 false，其他的都为 true，数字 0 也是 true
]]
print(type(true))
print(type(false))
print(type(nil))

if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false")
end

if 0 then
    print("数字 0 是 true")
else
    print("数字 0 为 false")
end
--[[
    boolean
    boolean
    nil
    false 和 nil 都为 false
    数字 0 是 true
]]

--用 2 个方括号 "[[]]" 来表示"一块"字符串

html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]

print(html)


--在对一个数字字符串上进行算术操作时，Lua 会尝试将这个数字字符串转成一个数字
print("2" + 6)
--8.0
print("2" + "6")
--8.0
print("2 + 6")
--2 + 6
print("-2e2" * "6")
---1200.0

--使用 # 来计算字符串的长度，放在字符串前面
len = "www.runoob.com"
print(#len)
--14
print(#"www.runoob.com")
--14


--[[
    table 的创建是通过"构造表达式"来完成，最简单构造表达式是{}，用来创建一个空表。也可以在表里添加一些数据，直接初始化表:
]]

-- 创建一个空的 table
local tbl1 = {}
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

--Lua 中的表（table）其实是一个"关联数组"（associative arrays），数组的索引可以是数字或者是字符串。
-- table_test.lua 脚本文件
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end
--[[
    key : value
    10 : 33
]]


--在 Lua 里表的默认初始索引一般以 1 开始
-- table_test2.lua 脚本文件
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end
--[[
    Key     1
    Key     2
    Key     3
    Key     4
]]


-- table 不会固定长度大小，有新数据添加时 table 长度会自动增长，没初始的 table 都是 nil
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

-- function_test.lua 脚本文件
function factorial1(n)
        if n == 0 then
            return 1
        else
            return n * factorial1(n - 1)
        end
    end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))


-- function_test2.lua 脚本文件
function testFun(tab,fun)
        for k ,v in pairs(tab) do
            print(fun(k,v));
        end
    end
    
    
tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
    return key.."="..val;
end
);